一.进程和线程概述
   进程:操作系统中运行的程序对应一个或多个进程
   线程:一个进程中至少有一个线程,线程控制着进程的执行
二.创建线程的第一种方式
    /*线程定义*/
   class 类名 extends Thread{
	  public void run(){
	  	//定义线程要执行的任务
	  }
   }
   /*创建线程并启动*/
  创建该类的对象然后调用start()方法
三.Thread类的常用方法
	/**
	 * Thread类中的方法:
	 *   static Thread currentThread()
	 *           获取当前执行的线程对象
	 String getName()
	 *           底层再给线程起名的时候默认是从0开始
	 *           Thread-0,Thread-1,Thread-2....
	 *
	 *    static void sleep(long millis)
	 *          可以让指定的线程休眠指定的毫秒值,当指定的毫秒值时间一到,该线程会自动醒来
	 *          当CPU再次切换到该线程的时候,会继续执行
	 */
四.创建线程的第二种方式
  class 类名 implements Runnable{
	  public void run(){
		  //定义线程要执行的任务
	  }
  }
  /*创建该线程并启动*/
  new Thread(new 类名()).start();
五.创建线程的第三种方式
	/**
	 * 线程第三种创建方式:匿名内部类
	 * 格式:
	 *   new 父类/父接口(){
	 *       //重写父类或父接口的方法
	 *   };
	 *  原理:
	 *    class 类名 extends 父类{
	 *       //重写父类的方法
	 *    }
	 *    new 类名();
	 *
	 *    class 类名 implements 父接口{
	 *        //实现父接口方法
	 *    }
	 *    new 类名();
	 */
		  new Thread() {
		      public void run(){
			      for (int i = 0; i < 10; i++) {
				System.out.println(getName()+"..."+i);
				}
		   }
		  }.start();

		new Thread(new Runnable(){
			public void run(){
		     for(int i=0;i< 10;i++){
		   System.out.println(Thread.currentThread().getName()+"..."+i);
		  }
		}
		}).start();
六:多线程安全性问题
  a.产生原因
    由于多个线程操作同一份共享资源,其中一个线程还没有执行完操作共享数据的代码,CPU切换到切换到
    其它线程去执行,最终导致共享数据错误
  b.解决方案
    1.同步代码块:保证其中一个线程在操作共享数据的时候不被其它线程打扰
		/**
		 * 保证多线程操作共享资源的安全性
		 * 使用同步代码块保证多线程安全性
		 * 格式
		 *  synchronized(锁对象){
		 *      我们一般将操作共享资源的代码放入到同步代码块中
		 *  }
		 *  锁对象指的是new出来的任意对象
		 *  1.如果某个线程进入同步代码块，该线程会持有该锁对象，其它线程就无法在进入同步代码块同时也无法持有该锁对象
		 *  2.如果某个线程走出同步代码块，该线程会释放该锁对象，此时其它某一个线程可以进入同步代码块同时可以持有该锁对象
		 *  注意:
		 *    所有线程享有同一个锁对象才能保证多线程操作共享资源安全性
		 */
   2.同步方法:
		/**
		 * 同步方法解决多线程安全问题:
		 * 格式:
		 *   修饰符 synchronized 返回值类型 方法名(形参列表){
		 *
		 *   }
		 *   同步方法相当于:
		 *   synchronized(this){//this引用指向new Thread()中传入的对象
		 *       //对方法中所有代码同步
		 *   }
		 *   我们一般将涉及到操作共享数据的代码单独抽取一个方法，然后在这个方法上加synchronized
		 */